package com.example.demo.repository;

import com.example.demo.entity.User;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.List;

/**
 * Created by 神盾局 on 2016/5/26.
 */
public class UserRepositoryImpl {
    @PersistenceContext
    private EntityManager entityManager;

    /**
     * 参数是写死的
     * @return
     */
    /**
     *
      public List<User> findAll(){
     // JPQL:select u from User u where u.id>5
     CriteriaBuilder cb = entityManager.getCriteriaBuilder();//获得工厂
     CriteriaQuery cq = cb.createQuery();//得到CriteriaQuery对象,查询语句拼装器
     Root<User> root = cq.from(User.class);//获取查询的根对象
     cq.select(root);//相当于JPQL的:select u from User
     //在Criteria查询体系中：where后面的条件就是一个Predicate，构造条件就是要
     //构造一个或者多个Predicate
     //greaterThan相当于'>'
     // root.get("id").as(Integer.class)相当于u.id，as是转换成类型
     //这样参数是写死的，不能通过变量传入进来
     Predicate pre = cb.greaterThan(root.get("id").as(Integer.class),5);
     cq.where(pre);
     Query query =  entityManager.createQuery(cq);
     List<User> users = query.getResultList();
     return users;
     }
     *
     */


//参数是通过变量传入进来的,查询对象
    /**
    public List<User> findAll(){
        // JPQL:select u from User u where u.id>5
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();//获得工厂
        CriteriaQuery cq = cb.createQuery();//得到CriteriaQuery对象,查询语句拼装器
        Root<User> root = cq.from(User.class);//获取查询的根对象
        cq.select(root);//相当于JPQL的:select u from User
        //在Criteria查询体系中：where后面的条件就是一个Predicate，构造条件就是要
        //构造一个或者多个Predicate
        //greaterThan相当于'>'
        // root.get("id").as(Integer.class)相当于u.id，as是转换成类型
        //这样参数是写死的，不能通过变量传入进来
//        Predicate pre = cb.greaterThan(root.get("id").as(Integer.class),5);
        //可变参数：cb.parameter(Integer.class,"id")，指定类型，指定属性
        Predicate pre = cb.greaterThan(root.get("id").as(Integer.class),cb.parameter(Integer.class,"id"));
        cq.where(pre);
        Query query =  entityManager.createQuery(cq);
        int a = 5;
        query.setParameter("id",a);//传入值，这样就可以用变量的方式传入进来
        List<User> users = query.getResultList();//这里是查询对象，也可以查询部分属性
        return users;
    }
            */
    //查询部分属性,返回的是Object[]
    /**
    public List<User> findAll(){
        // JPQL:select u from User u where u.id>5
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();//获得工厂
        CriteriaQuery cq = cb.createQuery();//得到CriteriaQuery对象,查询语句拼装器
        Root<User> root = cq.from(User.class);//获取查询的根对象
//        cq.select(root);//相当于JPQL的:select u from User

        cq.multiselect(root.get("id"),root.get("name"));  //这样查询出来就不是user，而是以个object[]数组

        Predicate pre = cb.greaterThan(root.get("id").as(Integer.class),cb.parameter(Integer.class,"id"));
        cq.where(pre);
        Query query =  entityManager.createQuery(cq);
        int a = 5;
        query.setParameter("id",a);//传入值，这样就可以用变量的方式传入进来
        List<Object[]> users = query.getResultList();//这里是查询对象，也可以查询部分属性
        System.out.println(users);
        return null;
    }
     */

    public List<User> findAll(){
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();//获得工厂
        CriteriaQuery cq = cb.createQuery();//得到CriteriaQuery对象,查询语句拼装器
        Root<User> root = cq.from(User.class);//获取查询的根对象
        cq.select(root);
        Predicate pre = cb.greaterThan(root.get("id").as(Integer.class),cb.parameter(Integer.class,"id"));
        Predicate pre1 = cb.lessThan(root.get("id").as(Integer.class),cb.parameter(Integer.class,"id1"));
//        cq.where(pre,pre1);//可以出入多个参数，可以执行参数是怎样连接，见下：
        //cb.and(pre,pre1),指定了连接的方式是and
        cq.where(cb.and(pre,pre1));


        Query query =  entityManager.createQuery(cq);
        int a = 5;
        int b = 8;
        query.setParameter("id",a);//传入值，这样就可以用变量的方式传入进来
        query.setParameter("id1",b);//传入值，这样就可以用变量的方式传入进来
        List<User> users = query.getResultList();//这里是查询对象，也可以查询部分属性
        System.out.println("*****************:  "+users);
        return null;
    }
}
